perm filename KWIC.PRG[T,LSP]2 blob sn#627075 filedate 1981-12-01 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002
C00023 ENDMK
C⊗;


   KWIC: PROCEDURE OPTIONS (MAIN);                                      KWI00010
      /*A PROGRAM TO FORMAT A KWIC INDEX*/                              KWI00020
                                                                        KWI00030
      DECLARE                                                           KWI00040
         DIR(10) FIXED (3,0),/*DIRECTORY ARRAY*/                        KWI00050
         I FIXED (2,0),/*COUNTER*/                                      KWI00060
         BIB CHAR (134) VARYING,/*BIBLIOGRAPHICAL MATERIAL*/            KWI00070
         TRUE BIT (1),/*SWITCH TRANSLATION*/                            KWI00080
         FALSE BIT (1),/*SWITCH TRANSLATION*/                           KWI00090
         OKOK BIT (1),/*END FLAG*/                                      KWI00100
         KEYWORDS(500,2) CHAR(50) VARYING,/*KWIC ELEMENTS*/             KWI00110
         FILL FIXED (3,0),/*COUNTER FOR ARRAY*/                         KWI00120
         STOPWORDS(7) VARYING CHAR(10) INIT ('A','AN','AND','FOR',      KWI00130
             'OF','THE','TO'),/*NON INDEXED TERMS*/                     KWI00140
         STOPWORDLENGTH FIXED BIN(15);/*SIZE OF STOPWD ARRAY*/          KWI00150
                                                                        KWI00160
    /*INITIALIZE VARIABLES*/                                            KWI00170
                                                                        KWI00180
      I = 0;                                                            KWI00190
      DIR = 0;                                                          KWI00200
      OKOK = '1'B;                                                      KWI00210
      TRUE = '1'B;                                                      KWI00220
      FALSE = '0'B;                                                     KWI00230
      DIR(10) = 0;                                                      KWI00240
      FILL = 1;                                                         KWI00250
      STOPWORDLENGTH = 7;                                               KWI00260
                                                                        KWI00270
      ON ENDFILE (SYSIN) OKOK = FALSE;                                  KWI00280
                                                                        KWI00290
                                                                        KWI00300
         GET EDIT ((DIR (I) DO I = 1 TO 9),BIB)                         KWI00310
            (9 F(3,0),A(133));                                          KWI00320
                                                                        KWI00330
   MRCTIME:/*GRAB TITLE & LCCN OUT OF BIB MATERIAL*/                    KWI00340
      DO WHILE (OKOK);                                                  KWI00350
                                                                        KWI00360
         CALL SEPARATE (SUBSTR(BIB,DIR(3),DIR(4)-DIR(3)),               KWI00370
                        SUBSTR(BIB,DIR(7),DIR(8)-DIR(7)));              KWI00380
         GET EDIT ((DIR (I) DO I = 1 TO 9),BIB)                         KWI00390
                  (9 F(3,0),A(133));                                    KWI00400
  END MRCTIME;                                                          KWI00410
                                                                        KWI00420
     CALL SORT(KEYWORDS,FILL-1);                                        KWI00430
                                                                        KWI00440
     CALL PRINT←IT(KEYWORDS,FILL-1);                                    KWI00450
                                                                        KWI00460
                                                                        KWI00470
  /*DIVIDE TITLES INTO KEYWORDS & STICK IN AN ARRAY WITH LCCN*/         KWI00480
  SEPARATE: PROCEDURE (TITLE,LCCN);                                     KWI00490
                                                                        KWI00500
      DECLARE                                                           KWI00510
         TITLE CHAR(50) VARYING,                                        KWI00520
         LCCN  CHAR(12) VARYING,                                        KWI00530
         POSITION FIXED (3,0),                                          KWI00540
        RESULT BIT (1),                                                 KWI00550
         MORE BIT (1),
         WORD CHAR(50) VARYING;                                         KWI00560
                                                                        KWI00570
 PUT DATA (TITLE);                                                      KWI00580
                                                                        KWI00590
     POSITION = INDEX(TITLE,' ');                                       KWI00600
     MORE = TRUE;
                                                                        KWI00610
     SAMURAI: DO WHILE (MORE);
      IF POSITION ↑= 0 THEN/*CHOP UP TITLE*/
         WORD = SUBSTR(TITLE,1,POSITION - 1);
         ELSE
            DO;
            MORE = FALSE;
            WORD = TITLE;
            END;

     /*SCAN FOR STOPWORDS*/                                             KWI00650
     CALL MEMBER (WORD,STOPWORDS,STOPWORDLENGTH,RESULT);                KWI00660
                                                                        KWI00670
     IF (RESULT = FALSE) THEN /*FILL ARRAY ACCEPTABLE WDS*/             KWI00680
        DO;                                                             KWI00690
        KEYWORDS(FILL,1) = WORD;                                        KWI00700
        KEYWORDS(FILL,2) = LCCN;                                        KWI00710
        FILL = FILL + 1;                                                KWI00720
        END;                                                            KWI00730
      PUT DATA (KEYWORDS(FILL,1));                                      KWI00740
     TITLE = SUBSTR(TITLE,POSITION + 1);                                KWI00750
     POSITION = INDEX(TITLE,' ');                                       KWI00760
     END SAMURAI;                                                       KWI00770
  END SEPARATE;                                                         KWI00780
                                                                        KWI00790
  MEMBER: PROCEDURE (ITEM,SET,N,RESULT);                                KWI00800
     DECLARE                                                            KWI00810
        SET(*) CHAR (10) VARYING,                                       KWI00820
        N FIXED BINARY (15), /*NO. OF STOPWORDS IN ARRAY*/              KWI00830
 I FIXED BINARY (15),/*ARRAY COUNTER*/                                  KWI00840
        GOGOGO BIT (1),/*SWITCH*/                                       KWI00850
        RESULT BIT (1),                                                 KWI00860
        ITEM CHAR (50) VARYING;                                         KWI00870
                                                                        KWI00880
  /*INITIALIZE VARIABLES*/                                              KWI00890
     RESULT = FALSE;                                                    KWI00900
     GOGOGO = TRUE;                                                     KWI00910
     I = 1;                                                             KWI00920
  PUT DATA (ITEM);                                                      KWI00930
                                                                        KWI00940
     TEST: DO WHILE ((I <= N) & GOGOGO);                                KWI00950
         IF (ITEM = SET(I)) THEN DO; GOGOGO = FALSE;                    KWI00960
                                     RESULT = TRUE;                     KWI00970
                                 END;                                   KWI00980
         I = I + 1;                                                     KWI00990
     END TEST;                                                          KWI01000
  END MEMBER;                                                           KWI01010
                                                                        KWI01020
  SORT: PROCEDURE (ARRAY,LOC);                                          KWI01030
      DECLARE                                                           KWI01040
         ARRAY(*,*) CHAR(50) VARYING,/*KEYWDS & LCCNS*/                 KWI01050
         TEMP CHAR(50) VARYING,/*FOR SHUFFLING AROUND ARRAY ITEMS*/     KWI01060
         LOC FIXED BIN(15),/*POINTER TO ARRAY*                          KWI01070
         PASS FIXED BIN(15),/*LOOKING OVER ARRAY*/                      KWI01080
         J FIXED BIN(15),/*COUNTER*/                                    KWI01090
         GO BIT(1);/*SWITCH*/                                           KWI01100
                                                                        KWI01110
     GO = TRUE;                                                         KWI01120
                                                                        KWI01130
     OUT←OF←SORTS:  DO PASS = 1 TO LOC - 1                              KWI01140
                       WHILE (GO);                                      KWI01150
                                                                        KWI01160
                      GO = FALSE;                                       KWI01170
                                                                        KWI01180
                                                                        KWI01190
     EACH←PASS: DO J = 1 TO LOC - PASS;                                 KWI01200
        IF ARRAY(J,1) > ARRAY(J + 1,1) THEN                             KWI01210
           DO;                                                          KWI01220
           GO = TRUE;                                                   KWI01230
           TEMP = ARRAY(J,1);                                           KWI01240
           ARRAY(J,1) = ARRAY(J + 1,1);                                 KWI01250
           ARRAY(J + 1,1) = TEMP;                                       KWI01260
           TEMP = ARRAY(J,2);                                           KWI01270
           ARRAY(J,2) = ARRAY(J + 1,2);                                 KWI01280
           ARRAY(J + 1,2) = TEMP;                                       KWI01290
           END;                                                         KWI01300
        END EACH←PASS;                                                  KWI01310
     END OUT←OF←SORTS;                                                  KWI01320
  END SORT;                                                             KWI01330
                                                                        KWI01340
  PRINT←IT: PROCEDURE(WORDS,FINDEM);                                    KWI01350
                                                                        KWI01360
    DECLARE                                                             KWI01370
      WORDS(*,*) CHAR(50) VARYING,                                      KWI01380
      FINDEM FIXED BIN(15);                                             KWI01390
                                                                        KWI01400
    FINDEM = 1;                                                         KWI01410
                                                                        KWI01420
    PUT SKIP LIST                                                       KWI01430
       (WORDS(FINDEM,1));                                               KWI01440
    PUT SKIP LIST                                                       KWI01450
       ('     '||WORDS(FINDEM,2));                                      KWI01460
                                                                        KWI01470
    LIST: DO I = 1 TO FINDEM;                                           KWI01480
        IF WORDS(FINDEM,1) ↑= WORDS((FINDEM + 1),1) THEN                KWI01490
           DO;                                                          KWI01500
             PUT SKIP(2) LIST (WORDS(FINDEM,1));                        KWI01510
             PUT SKIP LIST ('     '||WORDS(FINDEM,2));                  KWI01520
           END;                                                         KWI01530
        ELSE PUT SKIP LIST ('     '||WORDS(FINDEM,2));                  KWI01540
        FINDEM = FINDEM + 1;                                            KWI01550
    END LIST;                                                           KWI01560
  END PRINT←IT;                                                         KWI01570
  END KWIC;                                                             KWI01580

R; T=0.13/0.72 01:08:13

.λ